// 知识点1：weak_ptr：不控制所指向对象生命周期的智能指针，使用时必须进行判断对象是否存在

// shared_ptr<int> u(new int(1024));
// weak_ptr<int> w_ptr(u);
// if (shared_ptr<int> u = w_ptr.lock())
// {
// 	//....
// }
// 若weak_ptr指向的内容存在，则lock()返回一个指向共享对象的shared_ptr，若无，则返回空shared_ptr

// 这样的类定义应该放在头文件中
// class StrBlob {
// public:
//   friend class StrBlobPtr; //声明friend
//   StrBlobPtr begin();
//   StrBlobPtr end();
//   StrBlob(); //默认构造函数
//   StrBlob(initializer_list<string> il)
//       : data(make_shared<vector<string>>(il)) {} /// C++11新特性
//   StrBlob(string il) : data(make_shared<vector<string>>(il)) {}
//   //另一构造函数 typedef vector<string>::size_type size_type;
//   //定义类型别名，方便使用

//   //定义函数，返回大小
//   size_type size() const { return data->size(); }
//   //判断vector<string>是否为空
//   bool empty() { return data->empty(); }
//   //向vector<string>中加入元素
//   void pushback(const string &s) { data->push_back(s); }
//   //访问函数，应首先调用check()
//   string &front() {
//     check(0, "front on empty StrBlob");
//     return data->front();
//   }
//   string &back() {
//     check(0, "back on empty StrBlob");
//     return data->back();
//   }
//   void popback() {
//     check(0, "pop_back on empty StrBlob");
//     data->pop_back();
//   }

// private:
//   shared_ptr<vector<string>> data; //指向vector<string>的智能指针
//   void
//   check(size_type i,
//         const string &msg) const
//         //若访问元素的大小大于data的size,输出错误信息
//   {
//     if (i > data->size()) {
//       throw out_of_range(msg); //抛出该out_of_range异常，表示不在范围之内
//     }
//   }
// };

// class StrBlobPtr {
// public:
//   StrBlobPtr() : curr(0) {} //构造函数，将curr设定为0
//   StrBlobPtr(StrBlob &a, size_t sz = 0)
//       : wptr(a.data), curr(sz) {
//   } //构造函数，将StrBlob的智能指针与此类中的weak_ptr绑定
//   string &deref() const {
//     auto p = check(curr, "deference past end");
//     return (*p)[curr];
//   }
//   StrBlobPtr &incr() {
//     auto p = check(curr, "deference past end");
//     ++curr;
//     return *this;
//   }

// private:
//   shared_ptr<vector<string>>
//   check(size_t i,
//         const string &msg) const //检查函数，返回一个vector<string>的智能指针
//   {
//     auto ret = wptr.lock(); //检查对象是否还存在
//     if (!ret) {
//       throw runtime_error("未绑定");
//     }
//     if (i >= ret->size()) {
//       throw out_of_range(msg);
//     }
//     return ret;
//   }
//   weak_ptr<vector<string>> wptr; //定义弱智能指针
//   size_t curr;                   //设立游标，表示下标
// };

// StrBlobPtr StrBlob::begin() { return StrBlobPtr(*this); }
// StrBlobPtr StrBlob::end() { return StrBlobPtr(*this, data->size()); }